package com.Dao;

import com.bean.PageInfo;
import com.bean.Student;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author Lenovo
 * @date 2022/1/5
 */
//操作学生信息的获取 :题目不允许增加删除修改，必须在查询开始时，固定人数
public class StudentDao {

    private String sourcePath = "src/properties/file.csv";

    private  List<String> exactStringInfo(String line){
        List<String>tmp=new ArrayList<>();
        if(line==null||line.equals(""))
            return tmp;
        int index=-1;
        while((index=line.indexOf(','))!=-1){
            tmp.add(line.substring(0,index));
            line=line.substring(index+1);
        }
        tmp.add(line);
        return tmp;
    }

    public List<Student> queryStudent(PageInfo pageInfo){
        // 由mysql的" limit ?,? "
        // 第一个指偏移量，第二个指记录行最大数目
        int offset = pageInfo.getStartIndex(),
            maxNum = pageInfo.getPageSize();
        int high=offset+maxNum-1;
        List<Student>students=new ArrayList<>();
        File file= new File(this.sourcePath);
        // 处理文件不存在情况
        if(!file.exists()){
            try{
                file.createNewFile();
                System.out.println("属性文件不存在，请先将学生添加入库");
            }catch (IOException exp){
                //DO NOTHING
                System.out.println("当前尝试创建并以失败告终");
            }finally {
                return students;
            }
        }
        //处理数据
        int length =queryStudentCount(),
                curLength=0;
        //标准：[offset=low,high]∈[0,length-1]
        if(offset < 0 || high < 0 || offset >= length){//没有数据
            // DO Nothing:没有数据或越界了，不处理
            System.out.println("请检查参数有效性:"+"low="+ offset +",high="+high+".[注意：offset从0开始]");
        }else {
            FileReader fileReader;
            BufferedReader bufferedReader;
            try {
                // 获取数据过程
                fileReader = new FileReader(file);
                bufferedReader = new BufferedReader(fileReader);
                String tmpStr;//按行获取的临时字符串
                List<String>tmpInfo;
                while ((tmpStr = bufferedReader.readLine()) != null) {
                    if(curLength>= offset &&curLength<=high){
                        tmpInfo=exactStringInfo(tmpStr);
                        if(tmpInfo.get(0).equals("")){
                            System.out.println(tmpStr+":不符合规则，不予添加");
                        }else{
                            String sNo=tmpInfo.get(0);     // 学号
                            String sName=tmpInfo.get(1);   // 姓名
                            String classNo=tmpInfo.get(2);   //班级
                            String subject=tmpInfo.get(3); // 专业
                            String sex=tmpInfo.get(4);     // 性别
                            String academy=tmpInfo.get(5); //学院
                            students.add(new Student(sNo,  sName, classNo, subject,  sex,  academy));
                        }
                    }else if(curLength>high)
                        break;
                    curLength = curLength + 1;
                }
                fileReader.close();
            } catch (IOException e) {
               e.printStackTrace();
            }
        }
        return students;
    }

    //获取总数
    public int queryStudentCount(){
        File file= new File(this.sourcePath);
        // 处理文件不存在情况
        if(!file.exists()){
            try{
                file.createNewFile();
                System.out.println("属性文件不存在，请先将学生添加入库");
            }catch (IOException exp){
                //DO NOTHING
                System.out.println("当前尝试创建并以失败告终");
            }finally {
                return 0;
            }
        }
        int n=0;
        FileReader fileReader;
        BufferedReader bufferedReader;
        try {
            // 获取数据过程
            fileReader = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);
            String tmpStr, tmpInfo[];
            while ((tmpStr = bufferedReader.readLine()) != null) {
               n+=1;
            }
            fileReader.close();
        }catch (IOException e){
            //DO NOTHING
        }
        return n;
    }

    public List<Student> queryStudentBySnoOrSName(String searchSNoOrSName){
        List<Student>students=new ArrayList<>();
        File file= new File(this.sourcePath);
        // 处理文件不存在情况
        if(!file.exists()){
            try{
                file.createNewFile();
                System.out.println("属性文件不存在，请先将学生添加入库");
            }catch (IOException exp){
                //DO NOTHING
                System.out.println("当前尝试创建并以失败告终");
            }finally {
                return students;
            }
        }
        FileReader fileReader;
        BufferedReader bufferedReader;
        try {
            // 获取数据过程
            fileReader = new FileReader(file);
            bufferedReader = new BufferedReader(fileReader);
            String tmpStr;//按行获取的临时字符串
            List<String>tmpInfo;
            while ((tmpStr = bufferedReader.readLine()) != null) {
                tmpInfo=exactStringInfo(tmpStr);
                if(tmpInfo.get(0).equals("")){
                    System.out.println(tmpStr+":不符合规则，不予添加");
                }else{
                    String sNo=tmpInfo.get(0);     // 学号
                    String sName=tmpInfo.get(1);   // 姓名
                    String classNo=tmpInfo.get(2);   //班级
                    String subject=tmpInfo.get(3); // 专业
                    String sex=tmpInfo.get(4);     // 性别
                    String academy=tmpInfo.get(5); //学院
                    if(sNo.equals(searchSNoOrSName)||sName.equals(searchSNoOrSName))
                        students.add(new Student(sNo,  sName, classNo, subject,  sex,  academy));
                }
            }
            fileReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return students;
    }
}
